#include <stdio.h>
#include <mysql/mysql.h>
#include <string.h>

MYSQL* db_connect(const char* host, const char* user, const char* passwd, const char* db_name) {
   MYSQL *conn = mysql_init(NULL);
    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return NULL;
    }
   if (mysql_real_connect(conn, host, user, passwd, db_name, 0, NULL, 0) == NULL) {
       fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn); // 关闭并释放之前 init 的句柄
        return NULL;
    }
     printf("成功连接到数据库 '%s'！\n", db_name);
     return conn; // 返回成功的连接句柄
}
void db_disconnect(MYSQL *conn) {
    if (conn != NULL) {
        mysql_close(conn);
        printf("已断开数据库连接。\n");
    }
}
int db_execute(MYSQL *conn, const char* sql_query,MYSQL_RES **res_out) {
    // 执行查询，如果失败则打印错误并返回 NULL
    if (mysql_query(conn, sql_query)) {
        fprintf(stderr, "SQL query failed: %s\n", mysql_error(conn));
        return -1;
    }
    if(mysql_field_count(conn)>0){
        //说明是一个select语句
        MYSQL_RES *result = mysql_store_result(conn);
        if(result == NULL){
            //获取失败
            fprintf(stderr, "mysql_store_result failed: %s\n", mysql_error(conn));
            return -1;
        }
    
    if(res_out == NULL){
        //说明调用者不关心结果
        mysql_free_result(result);
    }
    else{
        *res_out=result;
    }
}
else{
    //这不是一个select语句
    if(res_out!=NULL){
         *res_out =NULL;
    }
    }
    return 0;//怎么都成功
}
int is_existed(MYSQL *conn,const char * sql_query){
    MYSQL_RES *res = NULL;
    db_execute(conn,sql_query,&res);
    if(res == NULL){
        //说明调用失败 也许是sql语句的问题
       fprintf(stderr , "failed in db_select!\n");
       return -2;     
    }
     my_ulonglong num_rows = mysql_num_rows(res);
     mysql_free_result(res);
     if(num_rows==0){
         return -1;
     }    
    return 0;
}

int generate_salt(char *salt_buf, size_t buf_size){
    const char *char_set = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    strcpy(salt_buf, "$6$");
    int salt_len = strlen(salt_buf);
    for (int i = 0; i < 16; ++i) {
        salt_buf[salt_len + i] = char_set[rand() % 64];
    }
    salt_len += 16;
    salt_buf[salt_len] = '$';
    salt_len++;
    salt_buf[salt_len] = '\0';

    return 0;
}

